/**
 * 唯一的音频初始化
 * 本系统只有该唯一的音频播放
 */
const initial = ({
	p_id, // 场景id。防止重复
	
	// innerAudioContext 对象的属性列表
	src, // 播放的音频
	startTime = 0, // 开始播放的位置（单位：s），默认 0
	autoplay = false, // 是否自动播放。页面没有用户的任何操作，无法有声音地自动播放
	loop = false, // 是否循环
	playbackRate = 1.0, // 默认播放速率。可取值：0.5/0.8/1.0/1.25/1.5/2.0，默认值为1.0
	obeyMuteSwitch = true, // 是否遵循系统静音开关，当此参数为 false 时，即使用户打开了静音开关，也能继续发出声音，默认值 true
	volume = 1, // 音量。范围 0~1
	/**
	 * 设置音频播放模式。默认值为"playback"
	 * ambient：不中止其他声音播放，不能后台播放，静音后无声音
	 * soloAmbient：中止其他声音播放，不能后台播放，静音后无声音
	 * playback：中止其他声音，可以后台播放，静音后有声音
	 */
	sessionCategory = 'soloAmbient',
	
	buffered, // 音频缓冲的时间点，仅保证当前播放时间点到此时间点内容已缓冲。
	paused, // 当前是是否暂停或停止状态，true 表示暂停或停止，false 表示正在播放
	currentTime, // 当前音频的播放位置（单位：s），只有在当前有合法的 src 时返回，时间不取整，保留小数点后 6 位
	duration, // 当前音频的长度（单位：s），只有在当前有合法的 src 时返回，需要在onCanplay中获取
	
	// 自定义的音频处理事件
	onCanplay, // 进入可以播放的状态，获取音频信息
	onPlay, // 播放时获取音频信息
	onTimeUpdate, // 播放进度更新获取音频信息
	onPause, // 暂停时获取音频信息
	onEnded, // 播放自然结束获取音频信息
	onError, // 播放错误时获取音频信息
	onWaiting, // 播放时由于网络等原因无法继续播放时获取音频信息
	onStop, // 播放停止的时候
	// ……
	// https://uniapp.dcloud.net.cn/api/media/audio-context.html#createinneraudiocontext
	
} = {}, play) => {
	if (src) {
		const playId = p_id || src
		if (audio.manager && playId === audio.p_id) {
			// 场景ID相同
			if (currentTime) {
				audio.manager.currentTime = currentTime
			}
			if (volume) {
				audio.manager.volume = volume
			}
			if (playbackRate) {
				audio.manager.playbackRate = playbackRate
			}
			if (paly) {
				// 如果要播放直接播放
				if (audio.status !== 1) {
					audio.manager.play()
				}
			}
		} else {
			// 不同的播放场景，先销毁并停掉上一个播放场景
			if (audio.manager) {
				audio.currentTime = 0
				audio.duration = 0
				audio.status = 0
				audio.manager.stop()
				audio.manager.destroy()
			}
			audio.p_id = playId
			audio.manager = uni.createInnerAudioContext()
			
			// 音频地址
			audio.manager.src = src
			// 是否自动播放。play表示初始化后自动播放
			audio.manager.autoplay = autoplay || play
			// 是否循环播放
			audio.manager.loop = loop
			// 设置播放音量
			audio.manager.volume = volume
			// 设置播放音量
			audio.manager.startTime = startTime
			// 是否遵循系统静音开关
			audio.manager.obeyMuteSwitch = obeyMuteSwitch
			// 设置播放模式
			audio.manager.sessionCategory = sessionCategory
			// 设置播放速率
			audio.manager.playbackRate = playbackRate
			// 进入可以播放的状态，可以获取音频信息
			audio.manager.onCanplay(() => {
				audio.status = 0
				audio.duration = audio.manager.duration
				onCanplay && onCanplay(audio.manager)
			})
			// 播放进度更新事件
			audio.manager.onTimeUpdate(() => {
				audio.status = 1
				audio.currentTime = audio.manager.currentTime
				onTimeUpdate && onTimeUpdate(audio.manager)
			})
			// 播放的时候
			audio.manager.onPlay(() => {
				audio.status = 1
				onPlay && onPlay(audio.manager)
			})
			// 暂停的时候
			audio.manager.onPause(() => {
				audio.status = 2
				onPause && onPause(audio.manager)
			})
			// 播放停止的时候
			audio.manager.onStop(() => {
				audio.status = 3
				onStop && onStop(audio.manager)
			})
			// 播放等待的时候
			audio.manager.onWaiting(() => {
				audio.status = 4
				onWaiting && onWaiting(audio.manager)
			})
			// 播放出错的时候
			audio.manager.onError((res) => {
				audio.status = 5
				if (onError) {
					onError(res, audio.manager)
				} else {
					console.log(res)
					uni.showToast({
						title: '音频播放出错',
						icon: 'error'
					})
				}
			})
			// 播放自然结束的时候
			audio.manager.onEnded(() => {
				audio.status = 0
				audio.currentTime = 0
				onEnded && onEnded(audio.manager)
			})
		}
	}
}

/**
 * 设置播放速率
 * 一定要有初始化的参数的src并正确
 * 
 * 默认值1.0
 * 0.5/0.8/1.0/1.25/1.5/2.0
 * 
 * H5上似乎不生效
 */
const setPlaybackRate = (playbackRate, params) => {
	if (audio.manager) {
		if (params.src === audio.p_id) {
			audio.manager.playbackRate = playbackRate
		}
	}
	if (params) {
		params.playbackRate = playbackRate
	}
}

/**
 * 暂停或播放
 * 一定要有初始化的参数的src并正确
 * 只要有参数就一定有结果
 */
const pausePlay = (params) => {
	if (audio.manager) {
		if (params.src === audio.p_id) {
			if (audio.status === 1) {
				audio.manager.pause()
			} else {
				audio.manager.play()
			}
			return
		}
	}
	if (params) {
		// 初始化并播放
		initial(params, true)
	}
}

/**
 * 停止播放
 * 参数不正确，就不执行，或者不传参数，停止当前播放的
 */
const stop = (params) => {
	if (audio.manager) {
		if (!params || params.src === audio.p_id) {
			audio.manager.stop()
		}
	}
}

/**
 * 跳转到指定位置播放
 * 一定要有初始化的参数的src并正确
 * 只要有参数就一定有结果
 */
const seek = (position, params) => {
	if (audio.manager) {
		if (params.src === audio.p_id) {
			return audio.manager.seek(position)
		}
	}
	if (params) {
		// 初始化再跳转
		initial({...params, startTime: position}, true)
	}
}

const audio = {
	manager: null,
	p_id: 'xxxxxx', // 播放场景id。如果没有，以src代替
	
	duration: 0, // 总长度
	currentTime: 0, // 当前播放时间
	// 当前播放状态。0：未播放；1：播放中；2：暂停；3：停止；4：等待；5：出错
	status: 0,
	
	initial,
	
	// 播放倍率数组
	playbackRates: [{text: '0.5倍', value: 0.5}, {text: '0.8倍', value: 0.8}, {text: '1.0倍', value: 1.0}, {text: '1.25倍', value: 1.25}, {text: '1.5倍', value: 1.5}, {text: '2.0倍', value: 2.0}],
	setPlaybackRate, // 设置播放速率
	pausePlay, // 暂停或播放
	stop, // 完全停止播放
	seek, // 跳转到指定位置播放
}

export default audio